package com.cdzy.config;

import com.cdzy.common.ApiException;
import com.cdzy.common.ApiExceptionCodeMsg;
import com.cdzy.common.ApiResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常处理器
 */
@ControllerAdvice // 这个注解表明该类是一个全局异常处理器，它将处理所有由Spring MVC控制器抛出的异常
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class) // 这个注解指定了异常处理器将捕获Exception类型的异常。这意味着任何未被控制器方法捕获的异常都将由这个处理器处理
    @ResponseBody // 这个注解表明方法的返回值将直接作为响应体返回给客户端，而不是渲染一个视图
    public ApiResponse<?> handleException(Exception e) {
        //这里先判断拦截到的Exception是不是我们自定义的异常类型
        if (e instanceof ApiException apiException) {
            // 如果是，它会将这个异常转换为ApiException对象，并使用异常中定义的代码和消息构造一个错误响应
            return ApiResponse.error(apiException.getCode(), apiException.getMsg());
        }
        // 默认异常返回服务器内部错误
        ApiExceptionCodeMsg apiExceptionCodeMsg = ApiExceptionCodeMsg.INTERNAL_SERVER_ERROR;
        return ApiResponse.error(apiExceptionCodeMsg.getCode(), apiExceptionCodeMsg.getMsg());
    }
}